package com.drerp.RH.ferias.DAO;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.drerp.RH.Cargo;
import com.drerp.RH.Colaborador;
import com.drerp.RH.HorasTrabalho;
import com.drerp.RH.DAO.GenericoDAO;
import com.drerp.RH.ferias.Ferias;

public class FeriasDAO extends GenericoDAO<Ferias, Long> {
	
	
	public List<Ferias> encontrarFerias() {
		List ativas = encontrarFeriasAtivas();
		List futuras = encontrarFeriasFuturas();
		ativas.addAll(futuras);
		
		return ativas;
	}
	
	
	public List<Ferias> encontrarFeriasColaborador(Colaborador colab) {
		List<Ferias> lista_ferias = null;
		
		Transaction trans = null;
		Session session = super.getSession();
		
		Long colab_id = colab.getUsuario_id();
		
		try {
			trans = session.beginTransaction();
			
			String hql = "SELECT f FROM Ferias f WHERE f.colab.usuario_id = :colab_id ORDER BY data_inicio DESC";
			Query query = session.createQuery(hql);
			query.setParameter("colab_id", colab_id);
			lista_ferias = super.findMany(query);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}

			e.printStackTrace();
		}
		
		return lista_ferias;
	}
	
	public List<Ferias> encontrarFeriasAprovadasColaborador(Colaborador colab) {
		List<Ferias> lista_ferias = null;
		
		Transaction trans = null;
		Session session = super.getSession();
		
		Long colab_id = colab.getUsuario_id();
		
		try {
			trans = session.beginTransaction();
			
			String hql = "SELECT f FROM Ferias f WHERE f.colab.usuario_id = :colab_id AND f.aprovada = true ORDER BY data_inicio DESC";
			Query query = session.createQuery(hql);
			query.setParameter("colab_id", colab_id);
			lista_ferias = super.findMany(query);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}

			e.printStackTrace();
		}
		
		return lista_ferias;
	}
	
	public List<Ferias> encontrarSolicitacoesColaborador(Colaborador colab) {
		List<Ferias> lista_ferias = null;
		
		Transaction trans = null;
		Session session = super.getSession();
		
		Long colab_id = colab.getUsuario_id();
		
		try {
			trans = session.beginTransaction();
			
			String hql = "SELECT f FROM Ferias f WHERE f.colab.usuario_id = :colab_id AND f.aprovada = false ORDER BY data_inicio DESC";
			Query query = session.createQuery(hql);
			query.setParameter("colab_id", colab_id);
			lista_ferias = super.findMany(query);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}

			e.printStackTrace();
		}
		
		return lista_ferias;
	}
	
	public Ferias ultimasFerias(Colaborador colab) {
		List<Ferias> lista_ferias = encontrarFeriasColaborador(colab);
		
		if(lista_ferias == null || lista_ferias.size()<1){
			return null;
		}else{
			return lista_ferias.get(0);
		}
	
	}
	
	public Calendar proximasFerias(Colaborador colab) {
		Ferias ultima = ultimasFerias(colab);
		Calendar proxima;
		
		if(ultima == null){
			proxima = colab.getDataContrato();
		}else{
			proxima = ultima.getData_inicio();
		}
		
		proxima.add(Calendar.YEAR, 1);
		return proxima;
	}
	
	
	
	public List<Ferias> encontrarFeriasAtivas() {
		List<Ferias> lista_ferias = null;
		
		Calendar cal = Calendar.getInstance(); 
		
		Transaction trans = null;
		Session session = super.getSession();
		
		try {
			trans = session.beginTransaction();
			
			String hql = "SELECT f FROM Ferias f WHERE f.data_inicio <= :data_atual AND f.data_termino > :data_atual AND f.aprovada = true";
			Query query = session.createQuery(hql);
			query.setParameter("data_atual", cal);
			lista_ferias = super.findMany(query);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}

			e.printStackTrace();
		}
		
		return lista_ferias;
	}
	
	
	public List<Ferias> encontrarFeriasFuturas() {
		List<Ferias> lista_ferias = null;
		
		Calendar cal = Calendar.getInstance(); 
		
		Transaction trans = null;
		Session session = super.getSession();
		
		try {
			trans = session.beginTransaction();
			
			String hql = "SELECT f FROM Ferias f WHERE f.data_inicio > :data_atual AND f.aprovada = true";
			Query query = session.createQuery(hql);
			query.setParameter("data_atual", cal);
			lista_ferias = super.findMany(query);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}

			e.printStackTrace();
		}
		
		return lista_ferias;
	}
	
	public List<Ferias> encontrarSolicitacoes() {
		List<Ferias> lista_ferias = null;
		
		Calendar cal = Calendar.getInstance(); 
		
		Transaction trans = null;
		Session session = super.getSession();
		
		try {
			trans = session.beginTransaction();
			
			String hql = "SELECT f FROM Ferias f WHERE f.data_inicio > :data_atual AND f.aprovada = false";
			Query query = session.createQuery(hql);
			query.setParameter("data_atual", cal);
			lista_ferias = super.findMany(query);
			
			trans.commit();
		} catch (RuntimeException e) {
			if (trans != null) {
				trans.rollback();
			}

			e.printStackTrace();
		}
		
		return lista_ferias;
	}
	
	
	
}
